package com.sunrise.financeiro.servico;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;

import lombok.Getter;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sunrise.financeiro.repositorio.iface.CategoriaFinanceiraDao;
import com.sunrise.financeiro.repositorio.iface.ContaDao;
import com.sunrise.financeiro.repositorio.iface.GrupoCategoriaFinanceiraDao;
import com.sunrise.financeiro.repositorio.iface.DespesaDao;
import com.sunrise.financeiro.repositorio.iface.RecorrenciaDao;
import com.sunrise.generico.entidade.CategoriaFinanceira;
import com.sunrise.generico.entidade.Conta;
import com.sunrise.generico.entidade.GrupoCategoriaFinanceira;
import com.sunrise.generico.entidade.Despesa;
import com.sunrise.generico.entidade.Recorrencia;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.enums.TipoMovimentacaoFinanceira;
import com.sunrise.generico.visao.Filtro;

@Service
@Transactional(readOnly = true)
public class ManterDespesaService {

	@Resource(name = "despesaDaoImpl")
	@Getter
	private DespesaDao despesaDAO;

	@Resource(name = "recorrenciaDaoImpl")
	@Getter
	private RecorrenciaDao recorrenciaDAO;

	@Resource(name = "contaDaoImpl")
	@Getter
	private ContaDao contaDAO;

	@Resource(name = "grupoCategoriaFinanceiraDaoImpl")
	@Getter
	private GrupoCategoriaFinanceiraDao grupoCategoriaFinanceiraDAO;

	@Resource(name = "categoriaFinanceiraDaoImpl")
	@Getter
	private CategoriaFinanceiraDao categoriaFinanceiraDAO;

	public Collection<Despesa> buscarPorFiltros(Filtro filtro) {
		Collection<Despesa>  despesas = getDespesaDAO().buscarPorFiltros(filtro);
		for(Despesa despesa : despesas){
			despesa.getRecorrencias().size();
		}
		return despesas;
	}

	public List<SelectItem> carregarCategoriasFinanceiras() {
		Collection<GrupoCategoriaFinanceira> grupos = getGrupoCategoriaFinanceiraDAO().listarGruposPorTipoMovimentacao(TipoMovimentacaoFinanceira.DESPESA);
		List<SelectItem> categoriasFinanceiras = new ArrayList<SelectItem>();

		for (GrupoCategoriaFinanceira grupo : grupos) {
			SelectItemGroup group = new SelectItemGroup(grupo.getNome());
			Collection<CategoriaFinanceira> categorias = getCategoriaFinanceiraDAO().listarPorGrupo(grupo.getId());
			SelectItem[] itens = new SelectItem[categorias.size()];
			int count = 0;
			if (categorias != null && !categorias.isEmpty()) {
				for (CategoriaFinanceira categoria : categorias) {
					itens[count++] = new SelectItem(categoria.getId(), categoria.getNome());
				}
				group.setSelectItems(itens);
				categoriasFinanceiras.add(group);
			}

		}

		return categoriasFinanceiras;
	}

	public Collection<Conta> carregarContas(Usuario usuario) {
		return getContaDAO().listarPorUsuario(usuario);
	}

	@Transactional(readOnly = false)
	public void salvar(Despesa entidade) {
		if(entidade.getRecorrencia()){
			for(Recorrencia recorrencia :  entidade.getRecorrencias()){
				getRecorrenciaDAO().inserir(recorrencia);
			}
		}
		getDespesaDAO().inserir(entidade);
	}

	public void carregarRecorrencias(Despesa entidade) {
		entidade.setRecorrencias(new ArrayList<Recorrencia>());
		if (entidade.getRecorrencia() && entidade.getTipoFrequencia() != null && entidade.getQtdRecorrencia() != null
				&& entidade.getQtdRecorrencia().compareTo(0) > 0) {
			for (int cont = 0; cont < entidade.getQtdRecorrencia(); cont++) {
				Recorrencia recorrencia = new Recorrencia();
				recorrencia.setNome(entidade.getNome());
				recorrencia.setDespesa(entidade);
				recorrencia.setDataCadastro(new Date());
				recorrencia.setValor(entidade.getValor());
				recorrencia.setDataCadastro(new Date());
				Calendar calendar = Calendar.getInstance();
				calendar.setTime(entidade.getDataLancamento());
				calendar.add(entidade.getTipoFrequencia().getCalendarField(), entidade.getTipoFrequencia() 
						.getQuantidade()*cont);
				recorrencia.setDataLancamento(calendar.getTime());
				entidade.getRecorrencias().add(recorrencia);
			}

		} else {
			entidade.setRecorrencias(new ArrayList<Recorrencia>());
		}

	}

}